const puppeteer = require('puppeteer');
const fs = require('fs');
const { join } = require('path');
const { PDFDocument } = require('pdf-lib')
const pdftk = require('node-pdftk');

// 页脚
const footerTemplate =
  `<div style="width:80%;margin:0 auto;font-size:8px;border-top:1px solid #ddd;padding:10px 0;display: flex; justify-content: space-between; ">
        <span style="">页脚</span>
        <div>
          <span class="pageNumber"></span> / <span class="totalPages"></span>
        </div>
      </div>`;
// 页眉
const headerTemplate =
  `<div style="width:80%;margin:0 auto;font-size:8px;border-bottom:1px solid #ddd;padding:10px 0;display: flex; justify-content: space-between;">
      <span class='title'>左页眉</span>
      <span class='date'></span>
    </div>`;
class PDF {
  async create () {
    // 生成浏览器
    const browser = await puppeteer.launch({
      headless: true,
      args: ['--no-sandbox', '--font-render-hinting=medium']
    })

    // 打开新窗口
    const pageCover = await browser.newPage()
    const pageContent = await browser.newPage()
    const pdfDoc = await PDFDocument.create()

    // 方法一: 通过读取 html 文件，然后 setContent

    // const coverHtml = fs.readFileSync(join(__dirname, '../','cover.html'), 'utf8');
    // const contentHtml = fs.readFileSync(join(__dirname, '../', 'content.html'), 'utf8')
    // // console.log('contentHtml: ', coverHtml, contentHtml);
    // pageCover.setContent(coverHtml);
    // pageContent.setContent(contentHtml);

    // 方法二:  直接通过 goto 方法去 读取文档内容;
    await pageCover.goto(`file://${process.cwd()}/cover.html`, {
      timeout: 30 * 1000,
      waitUntil: [
        'load',              //等待 “load” 事件触发
        'domcontentloaded',  //等待 “domcontentloaded” 事件触发
        'networkidle0',      //在 500ms 内没有任何网络连接
        'networkidle2'       //在 500ms 内网络连接个数不超过 2 个
      ]
    });

    await pageContent.goto(`file://${process.cwd()}/content.html`);
    // 共同的 options
    const options = {
      format: 'a4',
      printBackground: true,
      '-webkit-print-color-adjust': 'exact',
      displayHeaderFooter: true,
    }

    // 生成封面的 buffer
    const cover_buffer = await pageCover.pdf({
      ...options,
      landscape: false, // 横向还是纵向
      // path: 'public/cover.pdf',
      pageRanges: '1', // 只导出封面页
    })

    // 生成内容区的 buffer
    const content_buffer = await pageContent.pdf({
      ...options,
      // path: 'public/index.pdf',
      displayHeaderFooter: true,
      headerTemplate,
      footerTemplate,
      margin: {
        top: 80,
        bottom: 80
      },
    })


    // 生成封面文档
    const coverDoc = await PDFDocument.load(cover_buffer)
    const [coverPage] = await pdfDoc.copyPages(coverDoc, [0])
    pdfDoc.addPage(coverPage)

    const mainDoc = await PDFDocument.load(content_buffer)

    for (let i = 0; i < mainDoc.getPageCount(); i++) {
      const [aMainPage] = await pdfDoc.copyPages(mainDoc, [i])
      pdfDoc.addPage(aMainPage)
    }

    // 合并两个文件 buffer
    const pdf_buffer = [cover_buffer, content_buffer];
    // 生成pdf 文件并保存输出
    await pdfDoc.save()
    const pdf_path = '/public/pdf.pdf';

    return { pdf_buffer, pdf_path, browser }
    // await  pdftk
    //     .input(pdf_buffer)
    //     .output(join(__dirname,'..', pdf_path))
    //     .then(async (buf) => {
    //       await browser.close();
    //       console.log('第一次:', '写入完成');
    //     }).catch(err => {
    //       console.log('err: ', err);
    //     });
  }
}

// const pdf = new PDF;
// pdf.create();

module.exports = {
  PDF
}
